/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



package itm.dao.grupoInvestigacion;

//~--- non-JDK imports --------------------------------------------------------

import itm.exception.ControlException;

import itm.vo.file.ArchivoVO;
import itm.vo.grupoInvestigacion.CiudadVO;
import itm.vo.grupoInvestigacion.EventoPersonaGrupoVO;
import itm.vo.grupoInvestigacion.EventoVO;
import itm.vo.grupoInvestigacion.GrupoInvestigacionVO;
import itm.vo.grupoInvestigacion.PaisVO;
import itm.vo.grupoInvestigacion.RolVO;
import itm.vo.personas.PersonaVO;

//~--- JDK imports ------------------------------------------------------------

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Administrador
 */
public class GrupoInvestigacionDAO {
    private CallableStatement callStmt = null;
    private ResultSet         res      = null;
    private String            sql      = "";
    Connection                dbConexion;

    public GrupoInvestigacionDAO(Connection dbConexion) {
        this.dbConexion = dbConexion;
    }

    public List<GrupoInvestigacionVO> consultarGrupoInv(GrupoInvestigacionVO grupoVO)
            throws ControlException, SQLException {
        List<GrupoInvestigacionVO> listaGrupo = new ArrayList<GrupoInvestigacionVO>();

        try {
            sql      = "{call ITM_CONSULTAR_GRUPO_INV(?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setString(1, grupoVO.getIdConsulta());
            callStmt.setString(2, grupoVO.getNombreGrupo());
            res = callStmt.executeQuery();

            while (res.next()) {
                grupoVO = new GrupoInvestigacionVO();
                grupoVO.setIdGrupo(res.getInt(1));
                grupoVO.setNombreGrupo(res.getString(2));
                grupoVO.setEmailGrupo(res.getString(3));
                grupoVO.setFechaRegistro(res.getDate(4));
                listaGrupo.add(grupoVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaGrupo;
    }

    public GrupoInvestigacionVO consultarGrupoPK(GrupoInvestigacionVO grupoInvVO) {
        GrupoInvestigacionVO grupoVO = new GrupoInvestigacionVO();

        try {
            sql      = "{call ITM_CONSULTAR_GRUPO_INV_PK(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, grupoInvVO.getIdGrupo());
            res = callStmt.executeQuery();

            while (res.next()) {
                grupoVO = new GrupoInvestigacionVO();
                grupoVO.setIdGrupo(res.getInt(1));
                grupoVO.setNombreGrupo(res.getString(2));
                grupoVO.setMisionGrupo(res.getString(3));
                grupoVO.setVisionGrupo(res.getString(4));
                grupoVO.setPoliticasGrupo(res.getString(5));
                grupoVO.setEmailGrupo(res.getString(6));
                grupoVO.setFechaRegistro(res.getDate(7));
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return grupoVO;
    }

    public int crearEvento(EventoVO eventoVO) {
        int resultado = 0;

        try {
            sql      = "{call ITM_PARTICIPACION_EVENTO(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.BIGINT);
            callStmt.setInt(2, eventoVO.getIdLinea());
            callStmt.setInt(3, eventoVO.getIdGrupo());
            callStmt.setInt(4, eventoVO.getIdTipoEvento());
            callStmt.setString(5, eventoVO.getNombreEvento());
            callStmt.setInt(6, eventoVO.getIdPais());
            callStmt.setInt(7, eventoVO.getIdCiudad());
            callStmt.setString(8, eventoVO.getOrganizador());
            callStmt.setDate(9, eventoVO.getFechaInicio());
            callStmt.setDate(10, eventoVO.getFechaFin());
            callStmt.setString(11, eventoVO.getDuracion());
            callStmt.setString(12, eventoVO.getCostoXPersona());
            callStmt.setString(13, eventoVO.getDetalleCosto());
            callStmt.setString(14, eventoVO.getAsumeCosto());
            callStmt.setString(15, eventoVO.getJustificacion());
            callStmt.setString(16, eventoVO.getDescripcion());
            callStmt.setString(17, eventoVO.getImportanciaITM());
            callStmt.setString(18, eventoVO.getAporteProyectInt());
            callStmt.setString(19, eventoVO.getBeneficios());
            callStmt.setString(20, eventoVO.getAprobacion());
            callStmt.execute();
            resultado = callStmt.getInt(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public int crearGrupoInv(GrupoInvestigacionVO grupoVO) throws Exception {
        int resultado = 0;

        try {
            sql      = "{call ITM_CREAR_GRUPO_INV(?,?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.BIGINT);
            callStmt.setString(2, grupoVO.getNombreGrupo());
            callStmt.setString(3, grupoVO.getMisionGrupo());
            callStmt.setString(4, grupoVO.getVisionGrupo());
            callStmt.setString(5, grupoVO.getPoliticasGrupo());
            callStmt.setString(6, grupoVO.getEmailGrupo());
            callStmt.setDate(7, grupoVO.getFechaRegistro());
            callStmt.execute();
            resultado = callStmt.getInt(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public String eliminarGrupoInv(GrupoInvestigacionVO grupoVO) throws SQLException {
        String resultado = "";

        try {
            sql      = "{call ITM_ELIMINAR_GRUPO_INV(?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, grupoVO.getIdGrupo());
            callStmt.execute();
            resultado = callStmt.getString(1);

            return resultado;
        } catch (SQLException ce) {
            throw new SQLException(ce.getStackTrace().toString());
        }
    }

    public int guardarArchivoEvento(ArchivoVO archivoVO) {
        int resultado = 0;

        try {
            sql      = "{call ITM_GUARDAR_ANEXO_EVENTO(?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.BIGINT);
            callStmt.setInt(2, archivoVO.getIdModulo());
            callStmt.setString(3, archivoVO.getNombreArchivo());
            callStmt.setString(4, archivoVO.getDescripcion());
            callStmt.setString(5, archivoVO.getRutaArchivo());
            callStmt.setDate(6, archivoVO.getFechaArchivo());
            callStmt.execute();
            resultado = callStmt.getInt(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public String insertarParticipantes(EventoPersonaGrupoVO eventoPersonaGrupoVO) {
        String resultado = "";

        try {
            sql      = "{call ITM_AGREGAR_PARTICIPANTES_EVENTO(?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, eventoPersonaGrupoVO.getIdEvento());
            callStmt.setInt(3, eventoPersonaGrupoVO.getIdPersona());
            callStmt.setInt(4, eventoPersonaGrupoVO.getIdGrupo());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public List<PersonaVO> listarPersonasByGrupoPK(GrupoInvestigacionVO grupoInvVO) throws SQLException {
        List<PersonaVO> listaGrupo = new ArrayList<PersonaVO>();
        PersonaVO       personaVO  = new PersonaVO();

        try {
            sql      = "{call ITM_CONSULTAR_PERSONA_GRUPO_INV_PK(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, grupoInvVO.getIdGrupo());
            res = callStmt.executeQuery();

            while (res.next()) {
                personaVO = new PersonaVO();
                personaVO.setIdPersona(res.getString(1));
                personaVO.setNombrePersona(res.getString(2));
                listaGrupo.add(personaVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaGrupo;
    }

    public List<CiudadVO> listarCiudadesByPais(PaisVO paisVO) throws SQLException {
        List<CiudadVO> listaCiudades = new ArrayList<CiudadVO>();
        CiudadVO       ciudadVO;

        try {
            sql      = "{call ITM_LISTA_CIUDADES(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, paisVO.getIdPais());
            res = callStmt.executeQuery();

            while (res.next()) {
                ciudadVO = new CiudadVO();
                ciudadVO.setIdCiudad(res.getInt(1));
                ciudadVO.setCiudad(res.getString(2));
                listaCiudades.add(ciudadVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaCiudades;
    }

    public String modificarGrupoInv(GrupoInvestigacionVO grupoVO) throws SQLException {
        String resultado = "";

        try {
            sql      = "{call ITM_ACTUALIZAR_GRUPO_INV(?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, grupoVO.getIdGrupo());
            callStmt.setString(3, grupoVO.getMisionGrupo());
            callStmt.setString(4, grupoVO.getVisionGrupo());
            callStmt.setString(5, grupoVO.getPoliticasGrupo());
            callStmt.setString(6, grupoVO.getEmailGrupo());
            callStmt.execute();
            resultado = callStmt.getString(1);

            // return resultado;
        } catch (SQLException ce) {
            throw new SQLException(ce.getStackTrace().toString());
        }

        return resultado;
    }

    public List<GrupoInvestigacionVO> listarGrupoInv() throws SQLException {
        List<GrupoInvestigacionVO> listaGrupo = new ArrayList<GrupoInvestigacionVO>();
        GrupoInvestigacionVO       grupoVO;

        try {
            sql      = "{call ITM_LISTA_GRUPO_INV()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                grupoVO = new GrupoInvestigacionVO();
                grupoVO.setIdGrupo(res.getInt(1));
                grupoVO.setNombreGrupo(res.getString(2));
                listaGrupo.add(grupoVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaGrupo;
    }

    public List<PersonaVO> listarPersonas() throws SQLException {
        List<PersonaVO> listaPersonas = new ArrayList<PersonaVO>();
        PersonaVO       personaVO;

        try {
            sql      = "{call ITM_LISTAR_PERSONAS()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                personaVO = new PersonaVO();
                personaVO.setIdPersona(res.getString(1));
                personaVO.setNombrePersona(res.getString(2));
                listaPersonas.add(personaVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaPersonas;
    }

    public List<RolVO> listarRoles() throws SQLException {
        List<RolVO> listaRoles = new ArrayList<RolVO>();
        RolVO       rolVO;

        try {
            sql      = "{call ITM_LISTAR_ROLES()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                rolVO = new RolVO();
                rolVO.setIdRol(res.getInt(1));
                rolVO.setNombreRol(res.getString(2));
                listaRoles.add(rolVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaRoles;
    }

    public String insertarGrupoPersonaRol(GrupoInvestigacionVO grupoInvVO, PersonaVO personaVO, RolVO rolVO) {
        String resultado = "";

        try {
            sql      = "{call ITM_INSERTAR_PERSONA_ROL_GRUPO(?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, grupoInvVO.getIdGrupo());
            callStmt.setString(3, personaVO.getIdPersona());
            callStmt.setInt(4, rolVO.getIdRol());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public List<PersonaVO> listarPersonaGrupo(GrupoInvestigacionVO grupoInvVO) throws SQLException {
        List<PersonaVO> listaPersonas = new ArrayList<PersonaVO>();
        PersonaVO       personaVO;

        try {
            sql      = "{call ITM_LISTAR_PERSONAS_GRUPO(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, grupoInvVO.getIdGrupo());
            res = callStmt.executeQuery();

            while (res.next()) {
                personaVO = new PersonaVO();
                personaVO.setIdPersona(res.getString(1));
                personaVO.setNombrePersona(res.getString(2));
                listaPersonas.add(personaVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaPersonas;
    }

    public String eliminarPeronaGrupo(GrupoInvestigacionVO grupoVO, PersonaVO personaVO) throws SQLException {
        String resultado = "";

        try {
            sql      = "{call ITM_ELIMINAR_PERSONA_GRUPO(?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, grupoVO.getIdGrupo());
            callStmt.setString(3, personaVO.getIdPersona());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (SQLException ce) {
            throw new SQLException(ce.getStackTrace().toString());
        }

        return resultado;
    }
}
